<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 明天问：对象如何声明？如何修改属性？如何遍历对象？如何删除对象属性
    {
        // 1- 声明对象
        // const obj = new Object();
        // obj.username = "zhangsan";// 增加了实例属性，属性名是username,属性值是zhangsan
        // obj.fn = function(){
        //
        // }
        // console.log(obj)

        // 字面量的写法
        // const obj = {
        //     a: 1,
        //     b: 2,
        //     c: 3,
        //     // es5
        //     fn: function () {
        //         console.log(this===obj,"fn",this.a,this.b,this.c);
        //     },
        //     // es6
        //     fn2() {
        //         console.log(this===obj,"fn2",this.a,this.b,this.c)
        //     }
        // }
        // obj.fn();
        // obj.fn2();

        // call bind apply
        // const obj = {
        //     a:1,
        //     b:2,
        //     c:3
        // }
        // const obj2 = {
        //     a:100,
        //     b:200,
        //     c:300,
        //     fn(str1,str2){
        //         console.log(this===obj2,this.a,this.b,this.c,str1,str2);
        //     }
        // }
        // obj2.fn();// true 100 200 300
        // 函数也是对象,call是函数下的方法
        // 语法，第一个参数是指定的this,第二个参数开始是传递的值
        // obj2.fn.call(obj);// 调用fn,并将fn内的this指向到obj   false 1 2 3
        // obj2.fn.call(obj,"one","two");// 调用fn,并将fn内的this指向到obj,并传递了参数one,two   false 1 2 3

        // call与apply唯一的区别是传递参数:call参数从第二个开始依次传递，而apply传递的是一个数组
        // obj2.fn.apply(obj);// 调用fn,并将fn内的this指向到obj   false 1 2 3 undefined undefined
        // obj2.fn.apply(obj,["one","two"]);// 调用fn,并将fn内的this指向到obj,并传递了参数one,two   false 1 2 3

        // bind也是函数下的一个方法,bind可以指定this,也可以指定参数
        // obj为指定的this
        // 90,100 是传递的参数
        // const fn2 = obj2.fn.bind(obj,90,100);// 不会调用fn,会返回一个函数
        // fn2();
    }
    {
        // // 增加属性，修改属性
        // const username = "wangwu"
        // const obj = {
        //     a:1,
        //     b:2,
        //     c:3,
        //     username,// 相当于username:username,将常量的名字作为属性名，常量的值作为属性值
        //     [username]:"lisi",// 将常量username的值作为属性名，相当于wangwu:lisi
        //     "@abc":100,// 如果属性名中包含特殊字符,那么可以使用双引号或单引号对其进行包裹
        // }
        // obj.a = 100;
        // obj[username] = 10;// 修改的属性名是常量username的值，因为username的值是属性名
        // obj['@abc'] = 999;
        // // 如果使用的属性名中包含特殊字符，需要使用【】
        // console.log(obj.a,obj.b,obj.c,obj.username,obj[username],obj["@abc"]);
    }
    {
        // // 当使用对象下没有的属性时，获取到的值是undefined
        // // 如何遍历
        // const obj = {
        //     a:1,
        //     b:2,
        //     c:3
        // }
        // // for in
        // for(let key in obj){
        //     console.log(key,obj[key]);// key属性的名字  obj[key]:获取对应的属性值
        // }
    }
    {
        // 如何删除属性
        const obj = {
            a:1,
            b:2,
            c:3
        }
        delete obj.a;// 删除属性a
        console.log(obj);// {b:2,c:3}
    }
</script>
</html>